#include "ota.h"
#include "bsp_led.h"
#include "bsp_delay.h"
#include "bsp_can.h"
#include <log.h>
#include "log.h"
#include "can_ota.h"

int main(void)
{
    // 初始化RTT
    log_init();
    LOGI("RTT Initialized\r\n");

    // 初始化LED
    LED_Initialize(LED1_GPIO_PORT, LED1_GPIO_PIN);
    LED_Off(LED1_GPIO_PORT, LED1_GPIO_PIN);
    
    // 初始化CAN
    BSP_CAN_Init();
    LOGI("Bootloader Start...\r\n");
    
    // extern const uint8_t can_ota_device_id;
    // 初始化OTA
    // OTA_Init();
    // 初始化CAN OTA，配置设备ID
    CAN_OTA_Config ota_config = {
        .device_id = *(__IO uint8_t*)DEVICE_ID_ADDR,      // 设备ID，每个设备需要配置不同的ID
        .group_id = 0,       // 组ID，可用于分组升级
        .is_master = 0       // 是否为主设备
    };
    CAN_OTA_Init(&ota_config);
    
    // 检查是否需要进入升级模式
    if(OTA_CheckUpgradeFlag()) {
        LOGI("Enter OTA mode\r\n");
        
        while(1) {
            /* 处理CAN消息 */
            CAN_Message msg;
            while(BSP_CAN_GetMessage(&msg)) {
                // 处理接收到的CAN消息
                CAN_OTA_HandleMessage(msg.id, msg.data, msg.len);
            }
            LED1_TOGGLE;
            // SysTick_Delay_Ms(100);
        }
    } else {
        LOGI("Jump to application\r\n");
        OTA_JumpToApp();
    }
    
    // 如果跳转失败,就停在这里
    while(1) {
        /* 处理CAN消息 */
        CAN_Message msg;
        while(BSP_CAN_GetMessage(&msg)) {
            // 处理接收到的CAN消息
            CAN_OTA_HandleMessage(msg.id, msg.data, msg.len);
        }
        LED1_TOGGLE;
        // SysTick_Delay_Ms(100);
    }
}